<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: 流年 <liu21st@gmail.com>
// +----------------------------------------------------------------------

// 应用公共文件

//隐藏手机号码中间几位
function hideMobile($mobile)
{
    $result = substr($mobile, 0, 3) . '****' . substr($mobile, 7);
    return $result;
}

//获取手机后四位
function tailMobile($mobile)
{
    $result = substr($mobile, 7, 4);
    return $result;
}

//验证手机号码合法性
function checkMobile($mobile)
{
    if (!preg_match("/^1\d{10}$/", $mobile) && strpos($mobile, '100000000') !== 0) {
        return false;
    } else {
        return true;
    }
}

function includeRouteFiles($dir = 'route')
{
    $fullDir = __DIR__ . '/' . $dir;
    $files = scandir($fullDir);
    unset($files[0], $files[1]);
    foreach ($files as $filename) {
        if (is_dir($fullDir . '/' . $filename)) {
            includeRouteFiles($dir . '/' . $filename);
        } else {
            include $fullDir . '/' . $filename;
        }
    }
}

function webReturn($msg = '操作成功', $code = 0, $data = [])
{
    $result = [];
    $result['code'] = $code;
    $result['msg'] = $msg;
    $result['time'] = time();
    $result['data'] = $data ? $data : [];
    return json($result);
}

function stringToArray($string, $delimiter = ',', $check_func = '')
{
    $string = trim($string);
    $arr = explode($delimiter, $string);

    if ($arr) {
        if ($check_func) {
            $arr = array_map("{$check_func}", $arr);
        }

        $arr = array_unique(array_filter($arr));
    }

    return $arr;
}

/**
 * 获取指定长度的随机字母数字组合的字符串
 *
 * @param  int $length
 * @param  string $case
 * @return string
 */
function random($length = 16, $case = '')
{
    if ($case == 'upper') {
        $pool = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    } elseif ($case == 'lower') {
        $pool = '0123456789abcdefghijklmnopqrstuvwxyz';
    } else {
        $pool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    }

    return mb_substr(str_shuffle(str_repeat($pool, $length)), 0, $length, 'UTF-8');
}

/**
 * @desc   压缩图片 参考 https://blog.csdn.net/qiaqia609/article/details/51150821
 * a，图片宽或者高均小于或等于1280时图片尺寸保持不变，但仍然经过图片压缩处理，得到小文件的同尺寸图片
 * b，宽或者高大于1280，但是图片宽度高度比小于或等于2，则将图片宽或者高取大的等比压缩至1280
 * c，宽或者高大于1280，但是图片宽高比大于2时，并且宽以及高均大于1280，则宽或者高取小的等比压缩至1280
 * d，宽或者高大于1280，但是图片宽高比大于2时，并且宽或者高其中一个小于1280，则压缩至同尺寸的小文件图片
 * @author yiyu
 * @date  2020-02-18 16:18
 * @param $src string 原图本地路径
 * @param $dst string 缩略图路径
 * @param $quality int 压缩比例
 * @param $maxSize int 大于$maxSize才进行压缩
 * @param $keyword int 边界尺寸
 * @param $isChange boolean 边界尺寸是否动态的改变
 * @return boolean
 */
function compressPicture($src, $dst, $quality = 75, $maxSize = 50, $keyword = 640, $isChange = false)
{

    if (!is_readable($src)) {
        return false;
    }

    $src_size = filesize($src);

    if ($src_size < 50 || ($src_size < ($maxSize * 1024))) {
        return false;
    }
    // [0]=> int(1920)
    // [1]=> int(1080)
    // [2]=> int(2)
    // [3]=> string(26) "width="1920" height="1080""
    // ["bits"]=> int(8)
    // ["channels"]=> int(3)
    // ["mime"]=> string(10) "image/jpeg"
    list($src_width, $src_height, $src_type) = getimagesize($src);


    if ($isChange) {
        if ($src_size > 3145728) { //大于3M
            $keyword = 1280;
        } else {
            if ($src_size > 1048576 && $src_size <= 3145728) { //1M到3M之间
                $keyword = 960;
            } else {
                if ($src_size <= 1048576) {//小于1M
                    $keyword = 640;
                }
            }
        }
    }


    /*$type_arr = [
        1,//GIF
        2,//JPG
        3,//PNG
    ];

    if(!in_array($src_type,$type_arr)){
        return false;
    }
    */
    $dst_dir = dirname($dst);//目标文件目录
    if (!file_exists($dst_dir)) {
        mkdir($dst_dir, 0777, true);
    }


    switch ($src_type) {
        case 1:
            $tmp = imagecreatefromgif($src);//返回一图像标识符，代表了从给定的文件名取得的图像
            $old_type = 'gif';
            break;
        case 2:
            $tmp = imagecreatefromjpeg($src);
            $old_type = 'jpg';
            break;
        case 3:
            $tmp = imagecreatefrompng($src);
            $old_type = 'png';
            break;
        default:
            $tmp = imagecreatefromjpeg($src);
            $old_type = 'jpg';
            break;
    }

    $ratio = $src_width / $src_height; //宽高比

    $newImg = false;


    //图片宽或者高均小于或等于1280时图片尺寸保持不变，但仍然经过图片压缩处理，得到小文件的同尺寸图片
    //宽或者高大于1280 并且图片宽高比大于2时，并且宽或者高其中一个小于1280，则压缩至同尺寸的小文件图片
    if (($src_width <= $keyword && $src_height <= $keyword) || (($ratio < 0.5 || $ratio > 2) && (($src_width > $keyword || $src_height > $keyword) && $src_height > 0) && ($src_width < $keyword || $src_height < $keyword))) {
        $newImg = imagecreatetruecolor($src_width, $src_height);//返回一个图像标识符，代表了一幅大小为 x_size 和 y_size 的黑色图像
        if (3 === $src_type) {
            $white = imagecolorallocate($newImg, 255, 255, 255);//返回一个标识符，代表了由给定的 RGB 成分组成的颜色
            imagefilledrectangle($newImg, 0, 0, $src_width, $src_height,
                $white);//在 newImg 图像中画一个用 color 颜色填充了的矩形，其左上角坐标为 x1，y1，右下角坐标为 x2，y2。0, 0 是图像的最左上角
            imagecolortransparent($newImg,
                $white);// 将 newImg 图像中的透明色设定为 color。newImg 是 imagecreatetruecolor() 返回的图像标识符，color 是 imagecolorallocate() 返回的颜色标识符
        }
        imagecopyresampled($newImg, $tmp, 0, 0, 0, 0, $src_width, $src_height, $src_width,
            $src_height); //将一幅图像中的一块正方形区域拷贝到另一个图像中，平滑地插入像素值，因此，尤其是，减小了图像的大小而仍然保持了极大的清晰度。
    }


    //宽或者高大于$keyword
    if (($src_width > $keyword || $src_height > $keyword) && $src_height > 0) {
        //图片宽度高度比小于或等于2，则将图片宽或者高取大的等比压缩至$keyword
        if ($ratio <= 2) {
            if ($src_width > $src_height) { //宽为大边
                $dst_width = $keyword;
                $dst_height = $src_height / ($src_width / $keyword);
            } else {
                $dst_width = $src_width / ($src_height / $keyword);
                $dst_height = $keyword;
            }

            $newImg = imagecreatetruecolor($dst_width, $dst_height);//返回一个图像标识符，代表了一幅大小为 x_size 和 y_size 的黑色图像
            if (3 === $src_type) {
                $white = imagecolorallocate($newImg, 255, 255, 255);//返回一个标识符，代表了由给定的 RGB 成分组成的颜色
                imagefilledrectangle($newImg, 0, 0, $dst_width, $dst_height,
                    $white);//在 newImg 图像中画一个用 color 颜色填充了的矩形，其左上角坐标为 x1，y1，右下角坐标为 x2，y2。0, 0 是图像的最左上角
                imagecolortransparent($newImg,
                    $white);// 将 newImg 图像中的透明色设定为 color。newImg 是 imagecreatetruecolor() 返回的图像标识符，color 是 imagecolorallocate() 返回的颜色标识符
            }
            //目标图象连接资源  源图象连接资源  目标 X 坐标点  目标 Y 坐标点  源的 X 坐标点  源的 Y 坐标点 目标宽度 目标高度 源图象的宽度  源图象的高度
            imagecopyresampled($newImg, $tmp, 0, 0, 0, 0, $dst_width, $dst_height, $src_width,
                $src_height); //将一幅图像中的一块正方形区域拷贝到另一个图像中，平滑地插入像素值，因此，尤其是，减小了图像的大小而仍然保持了极大的清晰度。
        } else {
            //图片宽高比大于2时，并且宽以及高均大于1280，则宽或者高取小的等比压缩至1280
            if ($src_width > $keyword && $src_height > $keyword) {
                if ($src_width > $src_height) { //宽为大边
                    $dst_width = $src_width / ($src_height / $keyword);
                    $dst_height = $keyword;
                } else {
                    $dst_width = $keyword;
                    $dst_height = $src_height / ($src_width / $keyword);
                }

                $newImg = imagecreatetruecolor($dst_width, $dst_height);//返回一个图像标识符，代表了一幅大小为 x_size 和 y_size 的黑色图像
                if (3 === $src_type) {
                    $white = imagecolorallocate($newImg, 255, 255, 255);//返回一个标识符，代表了由给定的 RGB 成分组成的颜色
                    imagefilledrectangle($newImg, 0, 0, $dst_width, $dst_height,
                        $white);//在 newImg 图像中画一个用 color 颜色填充了的矩形，其左上角坐标为 x1，y1，右下角坐标为 x2，y2。0, 0 是图像的最左上角
                    imagecolortransparent($newImg,
                        $white);// 将 newImg 图像中的透明色设定为 color。newImg 是 imagecreatetruecolor() 返回的图像标识符，color 是 imagecolorallocate() 返回的颜色标识符
                }
                //目标图象连接资源  源图象连接资源  目标 X 坐标点  目标 Y 坐标点  源的 X 坐标点  源的 Y 坐标点 目标宽度 目标高度 源图象的宽度  源图象的高度
                imagecopyresampled($newImg, $tmp, 0, 0, 0, 0, $dst_width, $dst_height, $src_width,
                    $src_height); //将一幅图像中的一块正方形区域拷贝到另一个图像中，平滑地插入像素值，因此，尤其是，减小了图像的大小而仍然保持了极大的清晰度。

            }

        }
    }


    $dst_type = strtolower(substr(strrchr($dst, '.'), 1));

    if (is_resource($newImg)) {
        switch ($dst_type) {
            case 'gif':
                $return = imagegif($newImg, $dst);//从 newImg 图像以 filename 为文件名创建一个 JPEG 图像
                break;
            case 'jpg':
                $return = imagejpeg($newImg, $dst, $quality);
                break;
            case 'png':
                $return = imagepng($newImg, $dst);
                break;
            default:
                $return = imagejpeg($newImg, $dst, $quality);
                break;
        }

        list($new_width, $new_height) = getimagesize($dst);

        $new_size = filesize($dst);

        //如果裁剪后大小为0或者宽高为0
        if (!($new_width && $new_height && $new_size)) {
            @unlink($dst);
            imageDestroy($newImg);
            imageDestroy($tmp);
            return false;
        }

        //压缩后的图还大于原图
        if ($new_size > $src_size) {
            @unlink($dst);
            imageDestroy($newImg);
            imageDestroy($tmp);
            return false;
        }

        imageDestroy($newImg);
        imageDestroy($tmp);

        return $return;
    }


    imageDestroy($newImg);
    imageDestroy($tmp);

    return false;
}

//友好时间格式化
if (!function_exists('formatTime')) {
    function formatTime($time, $current = 0, $format = 'm-d H:i')
    {
        $current === 0 && $current = time();
        //说明是时间格式
        strtotime($time) !== false && $time = strtotime($time);
        $diff = $current - $time;
        switch (true) {
            case $diff <= 60:
                $result = '刚刚';
                break;
            case $diff < 3600:
                $result = floor(($diff / 60)) . '分钟前';
                break;
            case $diff < 86400:
                $result = floor(($diff / 3600)) . '小时前';
                break;
            case $diff < 86400 * 7:
                $result = floor(($diff / 86400)) . '天前';
                break;
            default:
                $result = date($format, $time);//02-19 10:20
                break;
        }

        return $result;
    }
}

function downFile($url, $savePath = './uploads', $aHeader)
{
    //$url = 'http://www.baidu.com/img/bdlogo.png';
    /*
      HTTP/1.1 200 OK
      Connection: close
      Content-Type: image/jpeg
      Content-disposition: attachment; filename="cK4q4fLsp7YOlaqxluDOafB.jpg"
      Date: Sun, 18 Jan 2015 16:56:32 GMT
      Cache-Control: no-cache, must-revalidate
      Content-Length: 963704
      */
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader);
    curl_setopt($ch, CURLOPT_HEADER, true); //需要response header
    curl_setopt($ch, CURLOPT_NOBODY, false);//需要response body
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 对认证证书来源的检查
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // 从证书中检查SSL加密算法是否存在
    $response = curl_exec($ch);
    //分离header与body
    $header = '';
    $body = '';
    if (curl_getinfo($ch, CURLINFO_HTTP_CODE) == '200') {
        $headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE); //头信息size
        $header = substr($response, 0, $headerSize);
        $body = substr($response, $headerSize);
    }
    curl_close($ch);
    //文件名
    $arr = array();
    if (preg_match('/filename="(.*?)"/', $header, $arr)) {
        $file = date('Ym') . '/' . $arr[1];
        $fullName = rtrim($savePath, '/') . '/' . $file;
        //创建目录并设置权限
        $basePath = dirname($fullName);
        if (!file_exists($basePath)) {
            @mkdir($basePath, 0777, true);
            @chmod($basePath, 0777);
        }
        if (file_put_contents($fullName, $body)) {
            return $file;
        }
    }
    return false;
}

